package telas;

import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.util.ArrayList;

import javax.swing.DefaultCellEditor;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;


import uteis.JLabel_customizado;
import uteis.componente_ancora;

public abstract class tela_base extends JDialog implements ComponentListener,
		WindowListener, ActionListener
{
	private static final long serialVersionUID = -3145848391866033700L;

	private final int bordas_horizontais = 18;
	private final int bordas_verticais = 45;

	private boolean tela_carregada = false;
	private ArrayList<componente_ancora> ancoras;
	private boolean DEBUG = false;

	private boolean ok_cancelado = false;

	protected JPanel jpn_conteudo;

	public boolean iniciar()
	{
		this.setVisible(true);
		return this.ok_cancelado;
	}

	protected void encerrar(boolean _ok_cancelado)
	{
		this.ok_cancelado = _ok_cancelado;
		this.setVisible(false);
	}

	public tela_base(String _titulo, int _largura, int _altura)
	{
		this.setModal(true);
		this.setTitle(_titulo);
		this.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
		this.setBounds(0, 0, _largura + bordas_horizontais, _altura
				+ bordas_verticais);
		this.setLocationRelativeTo(null);
		this.addWindowListener(this);

		this.ancoras = new ArrayList<componente_ancora>();

		this.criar_componentes();
	}

	protected void button_onclick(JButton _button)
	{
	}

	protected void checkbox_onclick(JCheckBox _checkbox)
	{
	}

	protected void adicionar_componente(JComponent _componente)
	{
		this.adicionar_componente(_componente, false);
	}

	protected void adicionar_componente(JComponent _componente, boolean _ancorar)
	{
		this.jpn_conteudo.add(_componente);

		if (_ancorar)
		{
			this.ancoras.add(new componente_ancora(_componente, this));
		}
	}

	protected JTextField criar_textfield(int _x, int _y, int _largura,
			int _altura)
	{
		return this.criar_textfield(_x, _y, _largura, _altura, null);
	}

	protected JTextField criar_textfield(int _x, int _y, int _largura,
			int _altura, JComponent _pai)
	{
		JTextField textfield = new JTextField();
		textfield.setBounds(_x, _y, _largura, _altura);

		if (_pai != null)
		{
			_pai.add(textfield);
		}

		return textfield;
	}

	protected JTextField adicionar_textfield(int _x, int _y, int _largura,
			int _altura)
	{
		return adicionar_textfield(_x, _y, _largura, _altura, false);
	}

	protected JTextField adicionar_textfield(int _x, int _y, int _largura,
			int _altura, boolean _ancorar)
	{
		JTextField textfield = this.criar_textfield(_x, _y, _largura, _altura);

		this.adicionar_componente(textfield, _ancorar);

		return textfield;
	}

	protected JComboBox<String> criar_combobox(int _x, int _y, int _largura,
			int _altura)
	{
		return this.criar_combobox(_x, _y, _largura, _altura, null);
	}

	protected JComboBox<String> criar_combobox(int _x, int _y, int _largura,
			int _altura, JComponent _pai)
	{
		JComboBox<String> combobox = new JComboBox<String>();

		combobox.setBounds(_x, _y, _largura, _altura);

		if (_pai != null)
		{
			_pai.add(combobox);
		}
		return combobox;
	}

	protected JComboBox<String> adicionar_combobox(int _x, int _y,
			int _largura, int _altura)
	{
		return adicionar_combobox(_x, _y, _largura, _altura, false);
	}

	protected JComboBox<String> adicionar_combobox(int _x, int _y,
			int _largura, int _altura, boolean _ancorar)
	{
		JComboBox<String> combobox = this.criar_combobox(_x, _y, _largura,
				_altura);

		this.adicionar_componente(combobox, _ancorar);

		return combobox;
	}

	protected JPanel criar_panel(int _x, int _y, int _largura, int _altura)
	{
		return this.criar_panel(_x, _y, _largura, _altura, null);
	}

	protected JPanel criar_panel(int _x, int _y, int _largura, int _altura,
			JComponent _pai)
	{
		JPanel panel = new JPanel();
		panel.setBounds(_x, _y, _largura, _altura);
		panel.setLayout(null);

		if (_pai != null)
		{
			_pai.add(panel);
		}

		return panel;
	}

	protected JPanel adicionar_panel(int _x, int _y, int _largura, int _altura)
	{
		return adicionar_panel(_x, _y, _largura, _altura, false);
	}

	protected JPanel adicionar_panel(int _x, int _y, int _largura, int _altura,
			boolean _ancorar)
	{
		JPanel panel = this.criar_panel(_x, _y, _largura, _altura);

		this.adicionar_componente(panel, _ancorar);

		return panel;
	}

	protected JScrollPane criar_scrollpane(int _x, int _y, int _largura,
			int _altura)
	{
		return this.criar_scrollpane(_x, _y, _largura, _altura, null);
	}

	protected JScrollPane criar_scrollpane(int _x, int _y, int _largura,
			int _altura, JComponent _pai)
	{
		JScrollPane scrollpane = new JScrollPane();
		scrollpane.setBounds(_x, _y, _largura, _altura);
		scrollpane.setLayout(null);

		if (_pai != null)
		{
			_pai.add(scrollpane);
		}

		return scrollpane;
	}

	protected JScrollPane adicionar_scrollpane(int _x, int _y, int _largura,
			int _altura)
	{
		return adicionar_scrollpane(_x, _y, _largura, _altura, false);
	}

	protected JScrollPane adicionar_scrollpane(int _x, int _y, int _largura,
			int _altura, boolean _ancorar)
	{
		JScrollPane scrollpane = this.criar_scrollpane(_x, _y, _largura,
				_altura);

		this.adicionar_componente(scrollpane, _ancorar);

		return scrollpane;
	}

	protected JLabel_customizado criar_label(String _texto, int _x, int _y)
	{
		return this.criar_label(_texto, _x, _y, null);
	}

	protected JLabel_customizado criar_label(String _texto, int _x, int _y,
			JComponent _pai)
	{
		JLabel_customizado label = new JLabel_customizado(_texto);
		label.setLocation(_x, _y);
		label.setSize(_texto.length() * 13, 16);

		if (_pai != null)
		{
			_pai.add(label);
		}

		return label;
	}

	protected JLabel_customizado adicionar_label(String _texto, int _x, int _y)
	{
		return adicionar_label(_texto, _x, _y, false);
	}

	protected JLabel_customizado adicionar_label(String _texto, int _x, int _y,
			boolean _ancorar)
	{
		JLabel_customizado label = this.criar_label(_texto, _x, _y);

		this.adicionar_componente(label, _ancorar);

		return label;
	}

	protected JButton criar_button(String _texto, int _x, int _y, int _largura,
			int _altura)
	{
		return this.criar_button(_texto, _x, _y, _largura, _altura, null);
	}

	protected JButton criar_button(String _texto, int _x, int _y, int _largura,
			int _altura, JComponent _pai)
	{
		JButton button = new JButton(_texto);
		button.setBounds(_x, _y, _largura, _altura);
		button.addActionListener(this);

		if (_pai != null)
		{
			_pai.add(button);
		}

		return button;
	}

	

	protected JScrollPane adicionar_rolagem(JComponent comp, JComponent _pai)
	{
		JScrollPane rolagem = new JScrollPane(comp);

		if (_pai != null)
		{
			_pai.add(rolagem);
		}

		return rolagem;

	}

	protected JButton adicionar_button(String _text, int _x, int _y,
			int _largura, int _altura)
	{
		return this.adicionar_button(_text, _x, _y, _largura, _altura, false);
	}

	protected JButton adicionar_button(String _texto, int _x, int _y,
			int _largura, int _altura, boolean _ancorar)
	{
		JButton button = this.criar_button(_texto, _x, _y, _largura, _altura);

		this.adicionar_componente(button, _ancorar);

		return button;
	}

	protected JCheckBox criar_checkbox(String _texto, int _x, int _y)
	{
		return this.criar_checkbox(_texto, _x, _y, null);
	}

	protected JCheckBox criar_checkbox(String _texto, int _x, int _y,
			JComponent _pai)
	{
		JCheckBox checkbox = new JCheckBox(_texto);
		checkbox.setLocation(_x, _y);
		checkbox.setSize(_texto.length() * 9, 16);
		checkbox.addActionListener(this);

		if (_pai != null)
		{
			checkbox.setBackground(_pai.getBackground());
			_pai.add(checkbox);
		}

		return checkbox;
	}

	protected JCheckBox adicionar_checkbox(String _text, int _x, int _y)
	{
		return this.adicionar_checkbox(_text, _x, _y, false);
	}

	protected JCheckBox adicionar_checkbox(String _texto, int _x, int _y,
			boolean _ancorar)
	{
		JCheckBox checkbox = this.criar_checkbox(_texto, _x, _y);

		this.adicionar_componente(checkbox, _ancorar);

		return checkbox;
	}

	protected JRadioButton criar_radiobutton(String _texto, int _x, int _y)
	{
		return this.criar_radiobutton(_texto, _x, _y, null);
	}

	protected JRadioButton criar_radiobutton(String _texto, int _x, int _y,
			JComponent _pai)
	{
		JRadioButton radiobutton = new JRadioButton(_texto);
		radiobutton.setLocation(_x, _y);
		radiobutton.setSize(25 + _texto.length() * 7, 16);
		radiobutton.addActionListener(this);

		if (_pai != null)
		{
			radiobutton.setBackground(_pai.getBackground());
			_pai.add(radiobutton);
		}

		return radiobutton;
	}

	protected JRadioButton adicionar_radiobutton(String _text, int _x, int _y)
	{
		return this.adicionar_radiobutton(_text, _x, _y, false);
	}

	protected JRadioButton adicionar_radiobutton(String _texto, int _x, int _y,
			boolean _ancorar)
	{
		JRadioButton radiobutton = this.criar_radiobutton(_texto, _x, _y);

		this.adicionar_componente(radiobutton, _ancorar);

		return radiobutton;
	}

	@Override
	public void componentResized(ComponentEvent e)
	{
		if (this.tela_carregada)
		{
			for (componente_ancora ancora : this.ancoras)
			{
				ancora.reposicionar();
			}
		}
	}

	@Override
	public void componentHidden(ComponentEvent arg0)
	{
	}

	@Override
	public void componentMoved(ComponentEvent arg0)
	{
	}

	@Override
	public void componentShown(ComponentEvent arg0)
	{
	}

	@Override
	public void windowActivated(WindowEvent e)
	{
	}

	@Override
	public void windowClosed(WindowEvent e)
	{
	}

	@Override
	public void windowClosing(WindowEvent e)
	{
	}

	@Override
	public void windowDeactivated(WindowEvent e)
	{
	}

	@Override
	public void windowDeiconified(WindowEvent e)
	{
	}

	@Override
	public void windowIconified(WindowEvent e)
	{
	}

	@Override
	public void windowOpened(WindowEvent e)
	{
		this.tela_carregada = true;
	}

	@Override
	public void actionPerformed(ActionEvent e)
	{
		if (e.getSource().getClass() == JButton.class)
		{
			button_onclick((JButton) e.getSource());
		}
		else if (e.getSource().getClass() == JCheckBox.class)
		{
			checkbox_onclick((JCheckBox) e.getSource());
		}
	}

	protected void criar_componentes()
	{
		this.jpn_conteudo = new JPanel();
		this.jpn_conteudo.setBorder(new EmptyBorder(5, 5, 5, 5));
		this.setContentPane(this.jpn_conteudo);
		this.jpn_conteudo.setLayout(null);
		this.jpn_conteudo.addComponentListener(this);
	}

	/*
	 * This method picks good column sizes. If all column heads are wider than
	 * the column's cells' contents, then you can just use
	 * column.sizeWidthToFit().
	 */
	
}